// app.js
App({
  onLaunch() {
    // 展示本地存储能力
    const logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    this.wxLogin()
    
    // 全局错误监听
    this.registerGlobalHandlers()
  },

  /**
   * 微信登录获取code
   */
  wxLogin() {
    wx.login({
      success: res => {
        if (res.code) {
          // 存储登录凭证，后续可用于获取用户身份
          this.globalData.loginCode = res.code
          console.log('登录凭证获取成功:', res.code)
        } else {
          console.error('获取登录凭证失败:', res.errMsg)
        }
      },
      fail: err => {
        console.error('微信登录失败:', err)
      }
    })
  },

  /**
   * 注册全局错误处理和生命周期监听
   */
  registerGlobalHandlers() {
    // 全局错误监听
    wx.onError(errMsg => {
      console.error('全局JS错误:', errMsg)
      // 这里可以添加错误上报逻辑
    })

    // 全局未处理的Promise拒绝
    wx.onUnhandledRejection(reason => {
      console.error('全局未处理的Promise拒绝:', reason)
      // 这里可以添加错误上报逻辑
    })
  },

  /**
   * 获取用户信息（支持回调和Promise）
   * @param {Function} callback - 回调函数
   * @returns {Promise} - 返回Promise对象
   */
  getUserInfo(callback) {
    return new Promise((resolve, reject) => {
      // 优先从缓存获取
      const cachedUserInfo = wx.getStorageSync('userInfo')
      if (cachedUserInfo) {
        this.globalData.userInfo = cachedUserInfo
        callback?.(null, cachedUserInfo)
        return resolve(cachedUserInfo)
      }

      // 如果没有缓存，则需要用户授权获取
      wx.getSetting({
        success: res => {
          if (res.authSetting['scope.userInfo']) {
            // 已经授权，可以直接获取用户信息
            wx.getUserInfo({
              success: res => {
                this.globalData.userInfo = res.userInfo
                wx.setStorageSync('userInfo', res.userInfo)
                callback?.(null, res.userInfo)
                resolve(res.userInfo)
              },
              fail: err => {
                callback?.(err)
                reject(err)
              }
            })
          } else {
            // 未授权，需要引导用户授权
            callback?.(new Error('用户未授权获取个人信息'))
            reject(new Error('用户未授权获取个人信息'))
          }
        },
        fail: err => {
          callback?.(err)
          reject(err)
        }
      })
    })
  },

  globalData: {
    userInfo: null,       // 用户信息
    loginCode: null,      // 登录凭证
    theme: 'light',       // 主题设置
    systemInfo: null,     // 系统信息
    networkType: 'unknown' // 网络类型
  }
})